import router from '@/router'
import store from '@/store'

router.beforeEach(async(to, from, next) => {
  const token = store.getters.token
  const url = to.path
  // 白名单
  const whiteList = ['/login', '/404', '/text']
  // 有 token 并且去 login 页 ，放行去首页
  if (token && url === '/login') {
    next('/')
  }
  // 有 token 不是去 login 页 ，放行
  if (token && url !== '/login') {
    // 这里是用户已经登录，并且不是进入登录页的状况
    // 其实用户登录后的除登录页外所有页面都需要用户数据
    // 所有用户数据的获取，应该在这里获取
    // 注意数据的获取是异步的，所有要等待数据获取完毕
    // 注意如果之前已经拿过数据（当前页面是从别的页面跳转，而不是刷新）就不重复获取数据了
    if (!store.state.user.userInfo.userId) {
      // console.log(store.dispatch('user/getUserInfo'))
      await store.dispatch('user/getUserInfo')
      // 获取用户数据之后，跳转页面之前
      const { roles } = store.state.user.userInfo
      const routes = await store.dispatch('permission/filterRoutes', roles.menus)
      router.addRoutes([
        ...routes,
        { path: '*', redirect: '/404', hidden: true }
      ])

      // 添加过路由后，也不会重新匹配的，所有在这之前没有的路由都会渲染成白屏
      // 要拿到当前的目的地，在强制跳转一次，让这个逻辑从头再执行一次匹配流程
      next(url)
    } else {
      // 如果不需要获取数据添加路由，直接放行即可
      next()
    }
  }
  // 没有 token ，在白名单上，放行
  if (!token && whiteList.includes(url)) {
    next()
  }
  // 没有 token ，不在白名单上，放行去 login 页
  if (!token && !whiteList.includes(url)) {
    next('/login')
  }
//   if (store.getters.token) {
//     if (to.path === '/login') {
//       next('/')
//     } else {
//       next()
//     }
//   } else {
//     if (whiteList.includes(to.path)) {
//     //   console.log(whiteList.includes(to.path))
//       // whiteList.indexOf(to.path) >= 0
//       // 判断一个数组是否存在某个元素
//       // whiteList.includes(to.path)
//       next()
//     } else {
//       next('/login')
//     }
//   }
})
